class Observer {
    constructor(data) {
        this.walk(data)
    }
    // 遍历对象所有属性
    walk (data) {
       // 1、判断data是否时对象
       if(!data || typeof data !== 'object') {
           return
       }
       // 遍历data对象的所有属性 
       Object.keys(data).forEach(key => {
           this.defineReactive(data, key, data[key])
       })
    }
    // val 防止死递归
    defineReactive(obj, key, val) {
        // 记录this
        let that = this
        // 每个每个属性添加Dep对象，收集依赖并发送通知
        let dep = new Dep()
        // 如果val是对象，对val内部的属性进行响应式数据
        this.walk(val)
        // 把属性转换为getter/setter
        Object.defineProperty(obj, key, {
            enumerable: true,
            configurable: true,
            get() {
                // 收集依赖， target是watcher对象
                Dep.target && dep.addSubs(Dep.target)
                return val
            },
            set(newValue) {
                if(newValue === val) {
                    return
                }
                val = newValue
                that.walk(newValue)
                // 发送通知，发送依赖
                dep.notify()
            }
        })
    }
}